var luaUtil = require('./luaUtil');
var async = require('async');
var cheerio = require('cheerio');      //  爬虫相关
var moment = require('moment');
var superagent = require('superagent');
var CommonUtil = require('../../../../../common/util/CommonUtil');
var staticizeUtil = require('../../util/staticizeUtil');
var YjxOrgRModel = require('../../../../../common/yjxMysql/mapping/YjxOrgRModel');
var YjxOrgModel = require('../../../../../common/yjxMysql/mapping/YjxOrgModel');
var YjxThirdPartyUserModel = require('../../../../../common/yjxMysql/mapping/YjxThirdPartyUserModel');
var YjxActivityModel = require('../../../../../common/yjxMysql/mapping/YjxActivityModel');
var YjxActUserProductModel = require('../../../../../common/yjxMysql/mapping/YjxActUserProductModel');
var YJxUserModel = require('../../../../../common/yjxMysql/mapping/YjxUserModel');
var YjxActFinanceHis = require('../../../../../common/yjxMysql/mapping/YjxActFinanceHis');
var YjxActRewardRuleModel = require('../../../../../common/yjxMysql/mapping/YjxActRewardRuleModel');
var activityUtil = require('../../util/activityUtil');  // 注意: 此处 引用 activityUtil 则 activityUtil 不能再引用 api4backUtil
var YjxActUserReward = require('../../../../../common/yjxMysql/mapping/YjxActUserReward');
var YjxActStatsModel = require('../../../../../common/yjxMysql/mapping/YjxActStatsModel');
var YjxCouponModel = require('../../../../../common/yjxMysql/mapping/YjxCouponModel');
var YjxUserModel =  require('../../../../../common/yjxMysql/mapping/YjxUserModel');
var YjxMemberModel = require('../../../../../common/yjxMysql/mapping/YjxMemberModel');
var YjxUserPointsHisModel = require('../../../../../common/yjxMysql/mapping/YjxUserPointsHisModel');
var YjxActUserReward = require('../../../../../common/yjxMysql/mapping/YjxActUserReward');
var luaUtil = require('./luaUtil');
var cacheManager = require('cache-manager');
var redisStore = require('cache-manager-redis');
var CONFIG = require('../../../../../common/config');
var vcdRedisCache = cacheManager.caching({
    store: redisStore,
    host: CONFIG.VCODE_REDIS_SERVER_DOMAIN,
    port: CONFIG.VCODE_REDIS_SERVER_PORT,
    auth_pass: CONFIG.VCODE_REDIS_SERVER_PASSWORD,
    db: CONFIG.VCODE_REDIS_SERVER_DB_NUMBER,
    ttl: CONFIG.VCODE_REDIS_SERVER_TTL,
    //prefix: CONFIG.VCODE_REDIS_SERVER_PREFIX
});
// 默认用户头像
var DEFAULT_USER_PROFILE_PHOTO = "http://itbour-back.oss-cn-hangzhou.aliyuncs.com/image/U13396/2017/12/15/181805976_wapZT7TnmRu3VV3Sm1MY";
// 默认用户签名
var DEFAULT_USER_SIGNATURE = "放纵你的自由";




var CODE = require('../../../../../common/code');

var api4backUtil = (function () {

    function api4backUtil() {
    }

    //--------------------------------------------------------------------------------------------
    /**
     * 生成推广码
     */
    api4backUtil.genPromoCode = function(){
        var ret = null;

        var cur = CommonUtil.genCurYearDayTimeStr();
        var p0 = CommonUtil.randomNumStr(2); // 2位随机数字
        var p1 = cur.substr(8); // 分秒
        var p2 = "";// index:001 [缩短长度 暂不使用]
        var p3 = cur.substr(0,8);// 年月日时
        p3 = CommonUtil.yearDayTimeStrtoAlphabet(p3); // 4位26进制字符串
        var tmp = Number(p0+p1+p2)||0;
        if(tmp && tmp>0) {
            var c1 = tmp.toString(36).toUpperCase();// 36进制
            //while (c1.length<6) {
            //    c1 = "0"+c1;
            //}
            ret = c1+p3;
        }

        return ret;
    };
    //--------------------------------------------------------------------------------------------


    /**
     * 建立搜索 redis 的缓存
     *
     * @author 王俊
     * @date 2017-11-24
     *
     * @param force 0/1强制建立缓存, 忽略已有的缓存
     * @param callback 回调
     *          error: 初始化失败
     *          data: 待定
     */
    api4backUtil.buildSearchRedisCache = function (force, callback) {

        var tasks = [];
        // 1. 是否强制重建缓存
        tasks.push(function (callback) {
            var data = {};
            data.force = force;
            if(!force) {
                return callback(null, data);
            }
            // 暂不进行强制建立
            return callback(null, data);
        });
        // 2. 查询缓存状态
        tasks.push(function (data, callback) {
            luaUtil.querySearchRedisStatus(function (error, result) {
                if(error) {
                    return callback(error, data);
                }
                // 记录缓存创建时间
                data.buildStart = result.buildStart;
                data.buildEnd = result.buildEnd;

                // 连 start 都没有, 可进行缓存建立操作
                if(!result.buildStart || result.buildStart.length === 0) {
                    return callback(error, data);
                }
                var customErr = '重复建立'; // 约定的特殊错误类型
                // 有 start 没有 end, 则缓存建立中
                if(!result.buildEnd || result.buildEnd.length === 0) {
                    data.errMsg = '缓存已在建立中, 请稍后';
                    return callback(customErr, data);
                }
                // 有 start 有 end, 则缓存已建立完成
                data.errMsg = '缓存已成功建立, 无需重复操作';
                return callback(customErr, data);
            });
        });
        // 3. 清空离线 db
        tasks.push(function (data, callback) {
            luaUtil.clearOfflineSearchRedisDB(function (error, result) {
                return callback(error, data);
            })
        });
        // 4. 设置缓存开始时间
        tasks.push(function (data, callback) {
            data.buildStart = moment().format('YYYY-MM-DD HH:mm:ss');
            luaUtil.updateSearchRedisStatus(data.force, data.buildStart, null, function (error, result) {
                return callback(error, data);
            });
        });

        // 5. 添加所有项目至redis
        tasks.push(function (data, callback) {
            //
            callback(null, data);
            // 添加至redis
            console.time('===== 建立缓存 =====');
            luaUtil.addAllUniItemToRedis(function (error, result) {
                console.timeEnd('===== 建立缓存 =====');
                if(error) {
                    console.log('yjx/v1/api4back/util/api4backUtil.js [buildSearchRedisCache] 添加项目至 redis 出错: ' + error + result);
                    return;
                }
                // 缓存建立完成, 更新状态
                data.buildEnd = moment().format('YYYY-MM-DD HH:mm:ss');
                luaUtil.updateSearchRedisStatus(0, data.buildStart, data.buildEnd, function (error, result) {
                    if(error) {
                        console.log('yjx/v1/api4back/util/api4backUtil.js [buildSearchRedisCache] 更新 redis 结束时间出错: ' + error + result);
                    }
                    // // 缓存建立完成, 切换 db
                    // luaUtil.switchSearchRedisDB(function (error, result) {
                    //     console.log('yjx/v1/api4back/util/api4backUtil.js [buildSearchRedisCache] 切换 redis 缓存 db 结束');
                    // })
                });
            });
        });
        async.waterfall(tasks, function (error, data) {
            if(error) {
                return callback(error, data);
            }
            return callback(error, data);
        });
    };

    /**
     * 切换 redis 的搜索 db
     *
     * @author 王俊
     * @date 2017-11-25
     *
     * @param callback
     *          err: 切换失败
     *          data: 待定
     */
    api4backUtil.switchSearchDB = function (callback) {
        luaUtil.switchSearchRedisDB(callback);
    };

    /**
     * 清空 redis 搜索的线下 db(恢复至可建立缓存状态)
     *
     * @author 王俊
     * @date 2017-11-28
     *
     * @param callback
     *          error: 清空是否失败
     */
    api4backUtil.clearSearchDB = function (callback) {
        // 更新 redis 状态为未建立缓存状态
        luaUtil.updateSearchRedisStatus(1, null, null, function (error) {
            if(error) {
                return callback(error);
            }
            // 清空离线缓存 db
            luaUtil.clearOfflineSearchRedisDB(function (clearErr) {
                return callback(clearErr);
            })
        })
    };

    /**
     * 强制建立搜索 redis 缓存
     *
     * @author 王俊
     * @date 2017-11-29
     *
     * @param callback
     *          error: 错误
     *          data: {
     *              buildStart: 开始时间
     *              buildEnd : 结束时间
     *              buildDuration : 开始到现在的持续时间,单位秒
     *              buildEstimate : 预估建立缓存时间,单位秒
     *          }
     */
    api4backUtil.forceBuildSearchRedisCache = function (callback) {
        // 1. 强制清空备份 db
        api4backUtil.clearSearchDB(function (clearErr) {
            if(clearErr) {
                return callback(clearErr, null);
            }

            // 2. 强制建立缓存
            api4backUtil.buildSearchRedisCache(1, function (buildErr, data) {
                var retData = {};
                if(data) {
                    if(data.buildStart) {
                        retData.buildStart = data.buildStart;
                        var end = data.buildEnd?data.buildEnd:CommonUtil.currentTime();
                        retData.buildDuration = CommonUtil.timeToTotalSeconds(end) - CommonUtil.timeToTotalSeconds(data.buildStart)
                    }
                    if(data.buildEnd) {
                        retData.buildEnd = data.buildEnd;
                    }
                    retData.buildEstimate = 600;
                    if(data.errMsg) {
                        retData.errMsg = data.errMsg;
                    }
                }
                return callback(buildErr, retData);
            });
        });
    };

    /**
     * 查询搜索 redis 建立的状态
     *
     * @author 王俊
     * @date 2017-11-29
     *
     * @param callback
     */
    api4backUtil.querySearchRedisStatus = function (callback) {
        luaUtil.querySearchRedisStatus(function (queryErr, data) {
            if(queryErr) {
                return callback(queryErr, null);
            }
            var retData = {};
            if(data) {
                if(data.buildStart) {
                    retData.buildStart = data.buildStart;
                    var end = data.buildEnd?data.buildEnd:CommonUtil.currentTime();
                    retData.buildDuration = CommonUtil.timeToTotalSeconds(end) - CommonUtil.timeToTotalSeconds(data.buildStart)
                    retData.buildEstimate = 600;
                }
                if(data.buildEnd) {
                    retData.buildEnd = data.buildEnd;
                }
            }
            return callback(queryErr, retData);
        });
    };


    /**
     * 添加一键秀[合作公司]成员
     * @author xc
     * @date  2018-06-11
     * @param mobile 成员手机号
     * @param orgId  组织id
     * @param desc   备注
     */
    api4backUtil.addYjxCoopUserInfo = function(mobile, orgId, desc, callback) {
        // 检查组织
        var oEnt = new YjxOrgModel({
            org_id: orgId,
            state: 4,
            del_flg: 0
        });
        oEnt.findFromDB(function(findErr, orgRet){
            if(findErr) {
                return callback('系统异常', null);
            }

            if(orgRet.length>0) {
                var orgInfo = orgRet[0];
                if(orgInfo.type != 400) {// 非合作方
                    return callback('公司组织信息异常', null);
                }

                // 检查第三方用户表
                var tpEnt = new YjxThirdPartyUserModel();
                tpEnt.getInfoByAccountKeyWithOrg(10, mobile, function(getErr, getRet){
                    if(getErr) {
                        return callback('系统异常', null);
                    }

                    if(getRet && getRet.length>0) {
                        // 第三方用户表存在
                        var tpUser = getRet[0];

                        var bInCoopOrg = false;// 是否存在于[合作类型]的公司组织
                        for(var i=0; i<getRet.length; i++) {
                            tpUser = getRet[i];
                            if(tpUser.org_type == 400) {// 合作方
                                bInCoopOrg = true;
                            }

                            if(tpUser.org_id == orgId) {
                                // 已经存在于该组织
                                // 只需更新备注
                                var orEnt = new YjxOrgRModel({
                                    org_id: orgId,
                                    user_id: tpUser.user_id,
                                    desc: desc||''
                                });
                                orEnt.updateToDB(function(updErr){
                                    var msg = '该用户已存在,备注已更新';
                                    if(updErr){
                                        msg = '该用户已存在,备注更新失败';
                                    }
                                    return callback(null, {userId: tpUser.user_id, msg:msg});
                                });

                                // 直接退出
                                return;
                            }
                        }

                        if(bInCoopOrg) {
                            return callback('该用户已存在于其他合作机构', null);

                        } else {
                            // 新建组织关联
                            addNewOrgR(tpUser.user_id, orgId, desc, function(addErr){
                                if(addErr) {
                                    return callback('添加公司组织失败', null);
                                }

                                return callback(null, {userId: tpUser.user_id});
                            });
                        }

                    } else {
                        // 第三方用户表不存在, 需要新建用户
                        var userEnt = new YJxUserModel({
                            user_type: 20,
                            nickname: mobile,
                            update_by: 'api_back'
                        });
                        userEnt.saveToDB(function(saveErr, newUserId){
                            if(saveErr) {
                                return callback('新建用户失败', null);
                            }

                            // 新建第三方表
                            tpEnt.user_id = newUserId;
                            tpEnt.account_type = 10;
                            tpEnt.field1 = mobile;
                            tpEnt.update_by = 'api_back';
                            tpEnt.saveToDB(function(saveErr2, newTpuId){
                                if(saveErr2) {
                                    return callback('新建用户失败', null);
                                }

                                // 新建组织关联
                                addNewOrgR(newUserId, orgId, desc, function(addErr){
                                    if(addErr) {
                                        return callback('添加公司组织失败', null);
                                    }

                                    return callback(null, {userId:newUserId});
                                });
                            });
                        });
                    }
                });

            } else {
                return callback('未找到公司组织信息', null);
            }
        });

        // 建立组织关联
        function addNewOrgR(userId, orgId, desc, cb){
            var ent = new YjxOrgRModel({
                user_id: userId,
                org_id: orgId,
                role: 0,// 普通用户
                desc: desc||''
            });
            ent.saveToDB(function(err){
                return cb(err);
            });
        }
    };

    /**
     * 更新组织关联备注信息
     * @author xc
     * @date 2018-06-25
     *
     * @param {Object} param         参数
     * @param {Number} param.userId  用户id (必须)
     * @param {Number} param.orgId   组织id (必须)
     * @param {String} param.state   组织关系状态
     * @param {String} param.desc    备注
     * @param {String} param.note    内部用备注
     * @param {String} param.delFlg  逻辑删除标记
     * @param {Function} callback
     */
    api4backUtil.updYjxOrgRInfo = function(param, callback) {
        var ent = new YjxOrgRModel({
            org_id: param.orgId,
            user_id: param.userId,
            update_by: param.userId
        });
        if(param.hasOwnProperty('state')) {
            ent.state = param.state;
        }
        if(param.hasOwnProperty('desc')) {
            ent.desc = param.desc;
        }
        if(param.hasOwnProperty('note')) {
            ent.note = param.note;
        }
        if(param.hasOwnProperty('delFlg')) {
            ent.del_flg = param.delFlg;
        }
        ent.updateToDB(function(updErr){
            return callback(updErr, null);
        });
    };

    /**
     * 获取组织用户信息列表
     * @author xc
     * @date  2018-07-09
     * @param pageNum   页码
     * @param pageSize  页容量
     * @param withTotalPage  是否需要总页数
     * @param orgId     组织id (必须)
     * @param mobile    用户手机号 (可选)
     * @param userId    用户id (可选)
     * @param nickname  用户昵称 (可选)
     */
    api4backUtil.getYjxOrgUserInfoList = function(param, callback) {
        var ent = new YjxUserModel;
        ent.getOrgUserInfoList(param, function(err, retInfo) {

            if(!param.withTotalPage) {
                return callback(err, {list: retInfo});
            }

            // 获取总页数
            ent.getOrgUserInfoListCnt(param, function (err2, count) {
                var totalPage = Math.floor((count-1)/param.pageSize)+1;
                var currentPage = param.pageNum;
                return callback(err2, {list:retInfo, totalPage:totalPage, currentPage:currentPage});
            });
        });
    };

    /**
     * 获取合作方参与活动列表
     * @author xc
     * @date 2018-06-25
     *
     * @param {Object} param  参数
     * @param {Number} param.pageNum  页码
     * @param {Number} param.pageSize  页容量
     * @param {Number} param.withTotalPage  是否需要总页数
     * @param {Number} param.coopOrgId  合作组织id
     * @param {Array} param.findStates  活动状态数组: [30,40]
     * @param {Number} param.withRewardInfo  是否返回奖励信息
     * @param {String} param.title  活动标题
     * @param {Function} callback
     */
    api4backUtil.getCoopActInfoList = function(param, callback) {
        var ent = new YjxActivityModel;
        ent.getActList_2(param, function(err, retInfo) {

            if(!param.withTotalPage) {
                return callback(err, {list: retInfo});
            }

            // 获取总页数
            ent.getActListCnt_2(param, function (err2, count) {
                var totalPage = Math.floor((count-1)/param.pageSize)+1;
                var currentPage = param.pageNum;
                return callback(err2, {list:retInfo, totalPage:totalPage, currentPage:currentPage});
            });
        });
    };

    /**
     * 获取组织参与活动的统计信息
     * @author xc
     * @date 2018-07-11
     *
     * @param {Object} param  参数
     * @param {Number} param.orgId 组织id
     * @param {Function} callback
     */
    api4backUtil.getOrgActStatsInfo = function(param, callback) {
        (new YjxActUserReward).getOrgActStatsInfo(param.orgId, function(err, ret){
            var retInfo = {
                reward:0,// 挑战总收益
                actCnt:0,// 挑战活动数
                prodCnt:0,// 发布(有效)作品数
                userCnt:0,// 组织成员数
            };
            if(ret && ret.length>0) {
                retInfo.reward=ret[0].reward;
                retInfo.actCnt=ret[0].actCnt;
                retInfo.prodCnt=ret[0].prodCnt;
                retInfo.userCnt=ret[0].userCnt;
            }

            return callback(null, retInfo);
        });
    };

    /**
     * 获取参与活动的用户作品列表
     * @author xc
     * @date 2018-06-26
     *
     * 参数：param.pageNum  页码
     * 参数：param.pageSize  页容量
     * 参数：param.withTotalPage  是否需要总页数
     * 参数：param.orgId  用户所属组织id
     * 参数：param.actId  活动id
     * 参数：param.userId  用户id
     * 参数：param.mobile  用户手机号
     * 参数：param.findStates  作品状态数组: [10新建, 20评审中, 30通过, 40不通过]
     */
    api4backUtil.getActUserProdInfoList = function(param, callback) {
        var ent = new YjxActUserProductModel;
        ent.getActProdList_2(param, function(err, retInfo) {

            if(!param.withTotalPage) {
                return callback(err, {list: retInfo});
            }

            // 获取总页数
            ent.getActProdListCnt_2(param, function (err2, count) {
                var totalPage = Math.floor((count-1)/param.pageSize)+1;
                var currentPage = param.pageNum;
                return callback(err2, {list:retInfo, totalPage:totalPage, currentPage:currentPage});
            });
        });
    };


    /**
     * 获取组织活动详情
     *
     * @author 王俊
     * @date 2018-06-11
     *
     * @param {Object} options   参数
     * @param {Number} options.userId        用户 id
     * @param {Number} options.orgId         组织 id
     * @param {Number} options.activityId    活动 id
     * @param {Function} callback
     */
    api4backUtil.getOrgActivityDetail = function (options, callback) {

        var totalTasks = [];

        // 1. 确认组织关系
        totalTasks.push(function (callback) {
            var entity = new YjxOrgRModel({
                user_id : options.userId,
                org_id : options.orgId,
                state : 10,  // 关系有效
                del_flg : 0
            });
            entity.findFromDB(function (error, relations) {
                if(error || !relations || relations.length <=0) {
                    return callback('权限不足, 无法查看', null);
                }
                var r = relations[0];
                if (!(r.role & 1) && !(r.role & 2) && !(r.role & 4) && !(r.role & 8)) {
                    return callback('权限不足, 无法查看', null);
                }
                var data = {};
                data.relation = r;
                return callback(error, data);
            });
        });

        // 2. 获取活动详细信息
        totalTasks.push(function (data, callback) {
            activityUtil.getSingleActivityDetailInfoById(options.activityId, function (error, actInfo) {
                data.retData = {};
                data.retData.activity = actInfo;

                return callback(error, data);
            });
        });
        // 3. 获取活动统计信息
        totalTasks.push(function (data, callback) {
            var entity = new YjxActivityModel();
            entity.getActivityStatisticsInfo({activityId : options.activityId}, function (error, info) {
                data.retData.brief = info;
                // 注意: 此处应根据参与平台类型来决定 totalData1 与 totalData2 对应字段, 暂不处理
                data.retData.brief.totalLike = info.totalData1 || 0;
                data.retData.brief.totalComment = info.totalData2 || 0;
                delete data.retData.brief.totalData1;
                delete data.retData.brief.totalData2 ;
                return callback(error, data);
            });
        });
        async.waterfall(totalTasks, function (error, data) {
            if (error) {
                return callback(error, null);
            }
            return callback(error, data.retData);
        });
    };


    /**
     * 获取组织活动作品列表
     *
     * @author 王俊
     * @date 2018-06-11
     *
     * @param {Object} options   参数
     * @param {Number} options.userId        用户 id
     * @param {Number} options.orgId         组织 id
     * @param {Number} options.activityId    活动 id
     * @param {Number} options.pageNum       页码
     * @param {Number} options.pageSize      页容量
     * @param {Number} options.withTotalPage 是否获取总页数
     * @param {Function} callback
     */
    api4backUtil.getOrgActivityProducts = function (options, callback) {

        var totalTasks = [];
        // 1. 权限验证
        totalTasks.push(function (callback) {
            var entity = new YjxOrgRModel({
                user_id : options.userId,
                org_id : options.orgId,
                state : 10,  // 关系有效
                del_flg : 0
            });
            entity.findFromDB(function (error, relations) {
                if(error || !relations || relations.length <=0) {
                    return callback('权限不足, 无法查看', null);
                }
                var r = relations[0];
                if (!(r.role & 1) && !(r.role & 2) && !(r.role & 4) && !(r.role & 8)) {
                    return callback('权限不足, 无法查看', null);
                }
                var data = {};
                data.retData = {};
                return callback(error, data);
            });
        });
        // 2. 获取列表
        totalTasks.push(function (data, callback) {
            var entity = new YjxActUserProductModel();
            var opt = {
                activityId : options.activityId,
                pageNum : options.pageNum,
                pageSize : options.pageSize
            };
            entity.getActivityProductList(opt, function (error, list) {
                data.retData.list = [];
                if(list && list.length > 0) {
                    for (var i=0; i<list.length; i++) {
                        var p = list[i];
                        data.retData.list.push({
                            id : p.aup_id,
                            thumb : p.theme_img_cust || p.theme_img,
                            url : p.url,
                            video : p.video,
                            state : p.state,
                            note : p.note,
                            rewardAmount : p.reward_amt,
                            unit : p.unit,
                        });

                        // 抖音
                        if(p.platform_type === 10) {
                            data.retData.list[i].like = Number(p.data1);
                            data.retData.list[i].comment = Number(p.data2);
                        }
                    }
                }
                return callback(error, data);
            });
        });
        // 3. 按需获取总页数
        totalTasks.push(function (data, callback) {
            if(!options.withTotalPage) {
                return callback(null, data);
            }
            var entity = new YjxActUserProductModel();
            var opt = {
                activityId : options.activityId
            };
            entity.getActivityProductListCnt(opt, function (error, count) {
                data.retData.totalPage = Math.floor((count-1)/options.pageSize)+1;
                data.retData.currentPage = options.pageNum;
                return callback(error, data);
            });
        });
        async.waterfall(totalTasks, function (error, data) {
            if(error) {
                return callback(error, null);
            }
            return callback(error, data.retData);
        });
    };


    /**
     * 获取组织用户信息
     *
     * @author 毛凯
     * @date 2018-06-11
     *
     * @param userName   用户名
     * @param password   密码
     * @param callback
     */
    api4backUtil.orgLogin = function (userName,password, callback) {
        var totalTasks = [];
        var entity = new YJxUserModel();
        var ActEntity = new YjxActivityModel();
        // 1. 验证用户
        totalTasks.push(function (callback) {
            entity.getUserInfoWithUserOrg(userName, password,0, function (error, orgUserInfo) {
                if (error || !orgUserInfo || orgUserInfo.length <= 0) {
                    return callback('用户名或密码错误', null);
                }
                var data = {};
                data.orgUserInfo = orgUserInfo;
                return callback(error, data);
            });
        });
        // 2. 获取该用户组织发布的所有活动和参与活动的作品总数
        totalTasks.push(function (data, callback) {
            if (!data || !data.orgUserInfo ){
                return callback('未获取到用户信息', null);
            }

            var orgDic = {};
            for (var i = 0;i<data.orgUserInfo.length;i++){
                var oneOrg = data.orgUserInfo[i];
                if (!orgDic[oneOrg.orgId]){
                    orgDic[oneOrg.orgId] = {
                        orgId : oneOrg.orgId,
                        orgName: oneOrg.orgName,
                    };
                }
            }
            var orgInfo = [];
            for(var key in orgDic){
                orgInfo.push(orgDic[key]);
            }
            data.orgInfo = orgInfo ;
            return callback(null, data);
        });
        //处理结果
        async.waterfall(totalTasks, function (error, data) {
            if (error) {
                return callback(error, null);
            }
            var userInfo = {
                userId : data.orgUserInfo[0].id, //用户id
                nickName : data.orgUserInfo[0].nickName, //用户昵称
                role : data.orgUserInfo[0].role //用户角色
            };
            var orgInfo = data.orgInfo;
            return callback(error, {userInfo : userInfo || {},orgInfo:orgInfo || {}});
        });
    };

    /**
     * 获取企业发布活动列表
     *
     * @author 毛凯
     * @date 2018-06-11
     *
     * @param {Object}  param 筛选活动的参数列表
     * @param {Array}  param.states    活动状态数组10未开场、20已开场、30活动截止、40活动关闭、50活动取消 数组的json字符串
     * @param {Number} param.pageNum   页码
     * @param {Number} param.pageSize  页容量
     * @param {Number} [param.userId]  用户id
     * @param {Number} [param.filterUser] 是否根据用户过滤活动列表, 0 不过滤, 1 过滤, 如使用该字段必须传递 userId
     * @param {Number} [param.checkReward] 是否检测用户在活动中的获奖状况,0 不过滤, 1 过滤,  如使用该字段必须传递 userId
     * @param {Number} param.withTotalPage 是否需要返回总页数  0不需要  1需要
     * @param {Number} param.orgId 组织id该接口不适用该参数
     * @param {Number} param.flag 用来标记当前接口需要使用publish字段
     * @param callback
     */
    api4backUtil.getOrgActivityList = function (param, callback) {
        var totalTasks = [];
        var entity = new YJxUserModel();
        var ActEntity = new YjxActivityModel();
        // 权限认证
        totalTasks.push(function (callback) {
            entity.getUserInfoWithUserOrg(null, null, param.userId,function (error, orgUserInfo) {
                if (error || !orgUserInfo || orgUserInfo.length <= 0) {
                    return callback('未获取到用户信息', null);
                }
                if (!(orgUserInfo[0].role & 1) && !(orgUserInfo[0].role & 2) && !(orgUserInfo[0].role & 4) && !(orgUserInfo[0].role & 8)) {
                    return callback('权限不足, 无法查看', null);
                }
                var data = {};
                data.orgUserInfo = orgUserInfo[0];
                return callback(error, data);
            });
        });
        //获取活动列表
        totalTasks.push(function (data, callback) {
            if (!data || !data.orgUserInfo) {
                return callback("未获取到用户信息", null);
            }
            ActEntity.getActivityList(param,function (err, result) {
                if (err) {
                    return callback(err, null);
                }
                data.activityList = result;
                return callback(null, data);
            });
        });
        //根据活动列表判断状态
        totalTasks.push(function (data, callback) {
            var list = [];
            if(! data.activityList ||  data.activityList.length <= 0){
                data.list = list;
                return callback(null,data);
            }
            list =  data.activityList;
            data.list = list;
            return callback(null,data);
        });
        //计算参加该组织活动的所有人数
        totalTasks.push(function (data, callback) {
            if (!data || !data.activityList || data.activityList.length <= 0){
                return callback(null,data);
            }
            var tasks = [];
            for (var i = 0; i < data.list.length; i++) {
                var t = (function (act) {
                    return function (ck) {
                        var actId = act.id;
                        ActEntity.getOrgActivityCntInfo(actId, function (err, result) {
                          if (result && result.length>0){
                              act.totalUser = result[0].totalUser || 0;
                              act.totalProducts = result[0].totalProducts || 0;
                              return ck(null,result);
                          }
                        });
                    }
                })(data.list[i]);
                if (tasks){ tasks.push(t);}
            }
            async.parallel(tasks,function (error, tasksResults) {
                if (error) {
                    return callback(error, null);
                }
                return callback(null, data);
            });
        });
        //需要分页则计算分页信息
        totalTasks.push(function (data, callback) {
            if (!param.withTotalPage){
                return callback(null,data);
            }
            ActEntity.getActivityListCnt(param,function (err,count) {
                data.totalPage = Math.floor((count-1)/param.pageSize)+1 || 0;
                return callback(null,data);
            });
        });
        //处理结果
        async.waterfall(totalTasks, function (error, data) {
            if (error) {
                return callback(error, null);
            }
            if (!param.withTotalPage){
                return callback(error, {list : data.list || []});
            }else{
                return callback(error,{list:data.list || [],currentPage: param.pageNum,totalPage:data.totalPage});
            }

        });
    };



    /**
     * (网红)公司计算某个活动的收益
     *
     * @author jackLiu
     * @date 2018-6-12
     *
     * @param   orgId  组织id
     * @param   activityId  活动id
     * @param   callback
     *              error: 错误
     *              data: 收益，单位：分
     */
    api4backUtil.calcPatnerActivityReward = function (orgId,activityId,callback) {
        var entity = new YjxActFinanceHis();
        entity.calcPatnerActivityReward (orgId,activityId,callback);
    };


    /**
     * (网红)公司对某个活动的收益进行记账
     *
     * @author jackLiu
     * @date 2018-6-12
     *
     * @param   orgId  组织id
     * @param   activityId  活动id
     * @param   reward  活动中该组织的总收益额，单位：分
     * @param   tax  所缴纳的税款，单位：分[目前传0即可]
     * @param   callback
     *              error: 错误
     */
    api4backUtil.recordPartnerActivityCash = function (orgId,activityId,reward,tax,callback) {
        var entity = new YjxActFinanceHis();
        entity.recordPartnerActivityCash (orgId,activityId,reward,tax,function(errCode){
            // errCode: 错误码：0表示成功，11表示参数错误，12表示余额为0，13表示输入的总收益与实际总收益不相同， 14表示处理失败
            errCode = Number(errCode);
            if(errCode===0){
                return callback(null);
            }else if(errCode===11){
                return callback(CODE.YJX_ACTIVITY_FAIL_PARAMETER_ERROR);
            }else if(errCode===12){
                return callback(CODE.YJX_ACTIVITY_FAIL_REMAINDER_NOT_ENOUGH);
            }else if(errCode===13){
                return callback(CODE.YJX_ACTIVITY_FAIL_REMAINDER_NOT_EQUAL);
            }else if(errCode===14){
                return callback(CODE.YJX_ACTIVITY_FAIL);
            }else{
                return callback(CODE.YJX_ACTIVITY_FAIL);
            }
        });
    };


    /**
     * 获取活动作品排名列表
     *
     * @author 王俊
     * @date 2018-06-11
     *
     * @param {Object} options   参数
     * @param {Number} options.activityId    活动 id
     * @param {Number} options.pageNum       页码
     * @param {Number} options.pageSize      页容量
     * @param {Number} options.withTotalPage 是否获取总页数
     * @param {Function} callback
     */
    api4backUtil.rankActProductScore = function (options, callback) {

        var totalTasks = [];
        // 获取列表
        totalTasks.push(function (callback) {
            var entity = new YjxActUserProductModel();
            var opt = {
                activityId : options.activityId,
                pageNum : options.pageNum,
                pageSize : options.pageSize
            };
            entity.getActivityProductList(opt, function (error, list) {
                var data = {};
                data.retData = {};
                data.retData.list = [];
                if(list && list.length > 0) {
                    for (var i=0; i<list.length; i++) {
                        var p = list[i];
                        data.retData.list.push({
                            id : p.aup_id,
                            thumb : p.theme_img_cust || p.theme_img,
                            url : p.url,
                            video : p.video,
                            state : p.state,
                            note : p.note,
                            rewardAmount : p.reward_amt,
                            unit : p.unit,
                            score : p.score,
                        });
                        // 抖音
                        if(p.platform_type === 10) {
                            data.retData.list[i].like = Number(p.data1) || 0;
                            data.retData.list[i].comment = Number(p.data2) || 0;
                        }
                    }
                }
                return callback(error, data);
            });
        });
        // 3. 按需获取总页数
        totalTasks.push(function (data, callback) {
            if(!options.withTotalPage) {
                return callback(null, data);
            }
            var entity = new YjxActUserProductModel();
            var opt = {
                activityId : options.activityId
            };
            entity.getActivityProductListCnt(opt, function (error, count) {
                data.retData.totalPage = Math.floor((count-1)/options.pageSize)+1;
                data.retData.currentPage = options.pageNum;
                return callback(error, data);
            });
        });
        async.waterfall(totalTasks, function (error, data) {
            if(error) {
                return callback(error, null);
            }
            return callback(error, data.retData);
        });
    };

    /**
     * 更新抖音作品信息(点赞, 评论, 视频地址等)
     *
     * @author 王俊
     * @date 2018-06-12
     *
     * @param {Object} options    活动唯一标识
     * @param {Number} options.activityId    活动唯一标识
     * @param {Number} options.productIds    活动唯一标识
     * @param {Function} callback      回调
     */
    api4backUtil.updateDouyinDataOfActivityProduct = function (options, callback) {


        var totalTasks = [];

        // 1. 获取活动基础信息
        totalTasks.push(function (callback) {
            var entity = new YjxActivityModel();
            entity.getSingleActivitySettingInfo(options.activityId, function (error, actInfo) {
                var data = {};
                data.actInfo = actInfo;
                if(data.actInfo && (data.actInfo.state === 40 || data.actInfo.state === 50 )) {
                    return callback('活动已关闭/已取消, 无法更新', null);
                }
                return callback(error, data);
            });
        });
        // 1. 获取活动对应作品列表
        totalTasks.push(function (data, callback) {
            var entity = new YjxActUserProductModel();
            entity.getActivityProductIds(options, function (error, products) {
                if(error) {
                    return callback(error, null);
                }
                data.products = products;
                return callback(error, data);
            });
        });
        // 2. 循环爬取抖音信息
        totalTasks.push(function (data, callback) {
            var wait = data.products.length <= 5;

            var spiderTasks = [];
            for (var i = 0; i<data.products.length; i++) {
                var t = (function (p) {
                     return function (callback) {
                         var opt = {
                             productId : p.aup_id,
                             url : p.url
                         };
                         // 单个失败不阻止后续操作
                         api4backUtil.spiderDouyinUrlAndUpdateUserProduct(opt, function (error) {
                             // 成功后等待 1s 再次请求, 避免请求太过频繁,
                             if(error) {
                                 console.log('spiderDouyinUrlAndUpdateUserProduct err: ' + error);
                             }
                             setTimeout(function () {
                                 return callback(null);
                             }, 1000);
                         });
                     }
                })(data.products[i]);
                if(t) spiderTasks.push(t);
            }

            async.parallelLimit(spiderTasks, 5, function (error, spiderResults) {
                if(wait) {
                    return callback(error, data);
                }
            });
            if(!wait) {
                return callback(null, data);
            }
        });

        async.waterfall(totalTasks, function (error, data) {
            return callback(error, {});
        });
    };

    /**
     * 爬取用户作品信息并更新至 db
     *
     * @author 王俊
     * @date 2018-06-12
     *
     * @param {Object} options 参数
     * @param {Number} options.productId 要更新的作品 id
     * @param {String} [options.url] 该作品对应的视频地址, 若没有则取数据库查询
     * @param {Function} callback
     *                      error: 操作失败
     */
    api4backUtil.spiderDouyinUrlAndUpdateUserProduct = function (options, callback) {
        var totalTasks = [];
        // 1. 按需获取要处理的地址
        totalTasks.push(function (callback) {
            var data = {};
            if(options.url) {
                data.url = options.url;
                return callback(null, data);
            }
            var entity = new YjxActUserProductModel({
                aup_id : options.productId,
                del_flg : 0
            });
            entity.findFromDB(function (error, products) {
                if(error || !products || products.length <=0) {
                    return callback(error || '作品无法处理');
                }
                data.url = products[0].url;
                if(!data.url || data.url.indexOf('http') !== 0) {
                    return callback('链接无效', data);
                }
                return callback(error, data);
            });
        });

        // 2. 爬取数据
        totalTasks.push(function (data, callback) {
            api4backUtil.spiderDouyinUrl(data.url, function (error, info) {
                if(error) {
                    console.log('api4backUtil.spiderDouyinUrl err: ' + error)
                }
                data.info = info;
                return callback(error, data);
            })
        });

        // 3. 更新 db
        totalTasks.push(function (data, callback) {
            var entity = new YjxActUserProductModel({
                aup_id : options.productId,
                del_flg : 0,
                video : data.info.video,
                theme_img : data.info.videoThumb,
                desc : data.info.desc,
                data1 : data.info.like,
                data2 : data.info.comment
            });
            entity.updateToDB(function (error) {
                if(error) {
                    console.log('spiderDouyinUrlAndUpdateUserProduct updateToDB  err: ' + error)
                }
                return callback(error, data);
            })
        });

        async.waterfall(totalTasks, function (error, data) {
            return callback(error);
        });

    };

    /**
     * 爬取抖音地址
     *
     * @author 王俊
     * @date 2018-06-12
     *
     * @param url       抖音链接
     * @param callback  回调
     *          error:
     *          data: {
     *                   "video": "https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f9a0000bcfijlk0gfki6blil9jg&line=0",
     *                   "videoThumb": "https://p9.pstatp.com/large/8cdf0009f44e1f00ccfa.jpg",
     *                   "like": 55000,
     *                   "comment": 307,
     *                   "desc":"啦啦啦"
     *          }
     */
    api4backUtil.spiderDouyinUrl = function (url, callback) {

        var totalTasks = [];

        // 1. 获取 html, 爬取点赞, 评论信息
        totalTasks.push(function (callback) {
            var ICON_FONT_MAP = {"78":"x","e602":"1","e603":"0","e604":"3","e605":"2","e606":"4","e607":"5","e608":"6","e609":"9","e60a":"7","e60b":"8","e60c":"4","e60d":"0","e60e":"1","e60f":"5","e610":"2","e611":"3","e612":"6","e613":"7","e614":"8","e615":"9","e616":"0","e617":"2","e618":"1","e619":"4","e61a":"3","e61b":"5","e61c":"7","e61d":"8","e61e":"9","e61f":"6"};
            // 用 superagent 去抓取 url 的内容
            superagent.get(url)
                .set({ 'User-Agent': "Mozilla/5.0 (iPhone; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12H143" })
                .end(function (err, sres) {
                    if(err) {
                        return callback(err, null);
                    }
                    var data = {video:"",videoThumb:"",like:"",comment:"",desc:""};
                    var $ = cheerio.load(sres.text);

                    // 视频链接
                    if($('video') && $('video').length > 0) {
                        data.video = $('video').eq(0).attr("src");
                    }

                    //视频描述
                    if($('#videoUser .user-title') && $('#videoUser .user-title').length > 0) {
                        data.desc = $('#videoUser .user-title').eq(0).text();
                    }
                    //视频封面图
                    if ($('#videoPoster')
                        && $('#videoPoster')[0]
                        && $('#videoPoster').css("background-image")
                        && $('#videoPoster').css("background-image").replace("url(","")) {
                        data.videoThumb = $('#videoPoster').css("background-image").replace("url(","").replace(")","");
                    }

                    $('.info-item').each(function (idx, element) {
                        var $element = $(element);
                        // 点赞数据
                        if($element.attr("data-item") && $element.attr("data-item") === "like") {
                            var arr = $element.find(".count").html().replace(/<i class=\"icon iconfont \">/g,"").replace(/<\/i>/g,"").replace(/\s/g,"").split("&#x");
                            for(var i=0;i<arr.length;i++){
                                if(arr[i].length<=0) continue;

                                var arr1 = arr[i].split(";");
                                if(arr1[0].length>0){
                                    data.like += ICON_FONT_MAP[arr1[0].toLowerCase()] || arr1[0].toLowerCase();
                                }
                                if(arr1[1].length>0){
                                    data.like += ICON_FONT_MAP[arr1[1].toLowerCase()] || arr1[1].toLowerCase();
                                }
                            }
                            if(data.like.indexOf("w")>=0){
                                data.like = Number(data.like.split("w")[0])*10000;
                            }
                            data.like = Number(data.like) || 0;
                        }
                        // 评论数据
                        if($element.attr("data-item") && $element.attr("data-item") === "comment") {
                            var arr = $element.find(".count").html().replace(/<i class=\"icon iconfont \">/g,"").replace(/<\/i>/g,"").replace(/\s/g,"").split("&#x");
                            for(var i=0;i<arr.length;i++){
                                if(arr[i].length <= 0) continue;
                                var arr1 = arr[i].split(";");
                                if(arr1[0].length>0){
                                    data.comment += ICON_FONT_MAP[arr1[0].toLowerCase()] || arr1[0].toLowerCase();
                                }
                                if(arr1[1].length>0){
                                    data.comment += ICON_FONT_MAP[arr1[1].toLowerCase()] || arr1[1].toLowerCase();
                                }
                            }
                            if(data.comment.indexOf("w")>=0){
                                data.comment = Number(data.comment.split("w")[0])*10000;
                            }
                            data.comment = Number(data.comment) || 0;
                        }
                    });
                    return callback(err, data);
                });
        });
        // 2. 获取真实视频地址
        totalTasks.push(function (data, callback) {
            superagent.get(data.video)
                .end(function (error, respons) {
                    if(respons && respons.redirects && respons.redirects > 0) {
                        data.video = respons.redirects[0];
                    }

                    return callback(error, data);
                })
        });

        async.waterfall(totalTasks, function (error, data) {
            return callback(error, data);
        })


    };

    /**
     * 计算并刷新活动作品信息
     *
     * @author 王俊
     * @date 2018-06-13
     *
     * @param activityId    活动 id
     * @param callback      回调
     *          err:        刷新出错
     */
    api4backUtil.rankAndRefreshActProductsInfo = function (activityId, callback) {
        var totalTasks = [];

        // 1. 获取活动基础信息
        totalTasks.push(function (callback) {

            var entity = new YjxActivityModel();
            entity.getSingleActivitySettingInfo(activityId, function (error, actInfo) {
                var data = {};
                data.actInfo = actInfo;
                if(data.actInfo && (data.actInfo.state === 40 || data.actInfo.state === 50 )) {
                    return callback('活动已关闭/已取消, 无法更新', null);
                }
                return callback(error, data);
            });
        });
        // 2. 获取活动规则信息
        totalTasks.push(function (data, callback) {
            var entity = new YjxActRewardRuleModel({
                as_id : data.actInfo.as_id,
                state : 10, // 10 有效
                type: 10,   // 活动奖励
                del_flg : 0
            });
            entity.findFromDB(function (error, rules) {
                if(error || !rules || rules.length <=0) {
                    return callback(error||'该活动状态异常', null);
                }
                data.rules = rules;
                return callback(error, data);
            });
        });
        // 3. 获取活动排名列表
        totalTasks.push(function (data, callback) {
            var entity = new YjxActUserProductModel();
            var opt = {
                activityId : activityId
            };
            entity.getActivityProductRealRankList(opt, function (error, products) {
                data.products =  products;
                return callback(error, data);
            });
        });
        // 4. 计算收益与排名
        totalTasks.push(function (data, callback) {
            data.upadteModels = [];
            for (var i=0; i < data.products.length; i++) {
                var product = data.products[i];

                var model = {};
                model.aup_id = product.aup_id;
                model.score = product.points;
                model.rank = i+1;   // 名次

                // 循环对比规则计算收益
                for (var j=0; j<data.rules.length; j++) {
                    var rule = data.rules[j];
                    // 判断规则, 规则外 0 元
                    if(model.rank < rule.min || model.rank > rule.max) {
                        model.reward_amt = 0;
                        // 不符合当前规则, 继续循环, 判断是否符合吓一条规则
                        continue;
                    }
                    // 按规则给钱
                    model.reward_amt = rule.reward_amt;
                    // 判断门槛, 达不到门槛, 奖金抹零
                    if(product.data1 < data.actInfo.threshold1
                        || product.data2 < data.actInfo.threshold2
                        || product.data3 < data.actInfo.threshold3
                        || product.data4 < data.actInfo.threshold4
                        || product.data5 < data.actInfo.threshold5) {
                        model.reward_amt = 0;
                        // 达不到参与条件, 奖金置零, 不参与评选,
                        break;
                    }
                    // 获得奖励跳出规则判断循环, 避免不合其他规则被重新置零
                    break;
                }
                data.upadteModels.push(model);
            }
            return callback(null, data);
        });
        // 5. 更新至 db
        totalTasks.push(function (data, callback) {
            var tasks = [];
            for (var i=0; i<data.upadteModels.length; i++) {
                var t = (function (model) {
                    return function (callback) {
                        var entity = new YjxActUserProductModel(model);
                        entity.updateToDB(function (error) {
                            // 单个更新失败不阻碍继续进行
                            return callback(null);
                        })
                    }
                })(data.upadteModels[i]);
                if(t) tasks.push(t);
            }
            async.parallelLimit(tasks, 5, function (error, results) {
                return callback(error, data);
            });
        });
        async.waterfall(totalTasks, function (error, data) {
            return callback(error, {});
        });
    };



    /**
     * 发放收益
     *
     * @author 毛凯
     * @date 2018-06-13
     *
     * @param activityId   活动id
     * @param callback  回调
     *
     */
    api4backUtil.issuingReceipts = function (activityId, callback) {

        var totalTasks = [];
        var entity = new YjxActUserProductModel();
        var rewEntity = new YjxActUserReward();
        var orgEntity = new YjxOrgRModel();
        // 1. 获取所有获奖的作品id
        totalTasks.push(function (callback) {
            var opt = {
                activityId : activityId,
                minReward  : 1
            };
            entity.getActivityProductIds(opt,function (err,result) {
                if (err){
                    return callback(err, null);
                }
                var data = {};
                data.activityUserProduct = result;
                return callback(null,data);
            });
        });
        // 2. 插入数据到用户的奖励表中
        totalTasks.push(function (data, callback) {
            if (!data || !data.activityUserProduct){
                return callback("未获取作品信息",null);
            }
            var tasks = [];
            for (var i = 0; i<data.activityUserProduct.length; i++) {
                var t = (function (aup) {
                    return function (callback) {
                        var aupId = aup.aup_id;
                        var userId = aup.user_id;
                        var orgId = aup.org_id ;
                        // 插入数据
                        rewEntity.addRewardInfoFromUserProductInfo(activityId,aupId,userId,orgId,function (error) {
                            if (error){return callback(null);}
                            return callback(null);
                        });
                    }
                })(data.activityUserProduct[i]);
                if(t) tasks.push(t);
            }
            async.waterfall(tasks, function (error, result) {
                if(error) {
                    return callback(error, null);
                }
                return callback(null,data);
            });
        });
        //3.关闭当前活动
        totalTasks.push(function (data, callback) {
            if (!data || !data.activityUserProduct){
                return callback("未获取作品信息",null);
            }
            (new YjxActivityModel()).updActivityState(activityId,function (err,result) {
                return callback(err,data);
            });
        });
        async.waterfall(totalTasks, function (error, data) {
            return callback(error, data);
        });
    };

    /**
     * 获取组织活动统计信息
     *
     * @author 毛凯
     * @date 2018-06-13
     *
     * @param orgId   组织id
     * @param userId  用户id
     * @param callback  回调
     *
     */
    api4backUtil.getOrgActivityInfo = function (orgId,userId,callback) {
        var totalTasks = [];
        var entity = new YJxUserModel();
        var ActEntity = new YjxActivityModel();
        // 1. 验证用户
        totalTasks.push(function (callback) {
            entity.getUserInfoWithUserOrg(0, 0,userId, function (error, orgUserInfo) {
                if (error || !orgUserInfo || orgUserInfo.length <= 0) {
                    return callback('未获取到用户信息', null);
                }
                var data = {};
                data.orgUserInfo = orgUserInfo[0];
                return callback(error, data);
            });
        });
        // 2. 获取该用户组织发布的所有活动和参与活动的作品总数
        totalTasks.push(function (data,callback) {
            if(!data || !data.orgUserInfo){
                return callback('未获取到用户信息', null);
            }
            ActEntity.getOrgActivityCntAndProductCnt(orgId, function (err, result) {
                if (err) {
                    return callback(err, null);
                }
                var activity ={};
                activity.totalActivity = result[0].totalActivity;
                activity.totalProducts = result[0].totalProducts;
                data.activity = activity;
                return callback(null, data);
            });
        });
        // 3. 获取参与该组织发布活动的人数
        totalTasks.push(function (data, callback) {
            if (!data || !data.activity) {
                return callback("未获取到信息", null);
            }
            ActEntity.getOrgActivityAllId(orgId, function (err, result) {
                if (err) {
                    return callback(err, null);
                }
                data.activityIds = result;
                return callback(null,data);
            });
        });
        // 4. 计算参加该组织活动的所有人数
        totalTasks.push(function (data, callback) {
            if (!data || !data.activityIds || data.activityIds.length <= 0){
                return callback(null,data);
            }
            var tasks = [];
            for (var i = 0; i < data.activityIds.length; i++) {
                var t = (function (actId) {
                    return function(ck) {
                        ActEntity.getOrgActivityAllUser(orgId, actId, function (err, result) {
                            if (result) {
                                return ck(null, result);
                            }else{
                                return ck(null,null);
                            }
                        });
                    }
                })(data.activityIds[i].act_id);
                if (tasks){ tasks.push(t);}
            }
            async.parallelLimit(tasks, 5,function (error, tasksResults) {
                if (error) {
                    return callback(error, null);
                }
                var totalJoinUser = 0;
                if (tasksResults && tasksResults.length > 0) {
                    for (var i =0;i<tasksResults.length;i++){
                        totalJoinUser += tasksResults[i];
                    }
                }
                data.activity.totalJoinUser = totalJoinUser;
                return callback(null, data);
            });
        });
        //处理结果
        async.waterfall(totalTasks, function (error, data) {
            if (error) {
                return callback(error, null);
            }
            return callback(error, {activity : data.activity||{} });
        });
    };




    /**
     * 刷新活动浏览次数
     *
     * @author 毛凯
     * @date 2018-6-26
     *
     * @param   actIds  活动ids
     * @param   callback
     *              error: 错误
     */
    api4backUtil.refreshActViewCnt = function (actIds,callback) {
        var totalTasks = [];
        // 1. 获取ids
        totalTasks.push(function (callback) {
            var data  = {};
            data.ids = [];
            if (actIds && actIds.length > 0){
                data.ids = actIds;
                return callback(null,data);
            }
            (new YjxActivityModel()).getOrgActivityAllId(0,function (err,result) {
                if(err || !result || result.length<= 0){
                    return callback(err || "为查询到数据",null);
                }
                for (var i = 0;i<result.length;i++){
                    var actId = result[i].act_id;
                    data.ids.push(actId);
                }
                return callback(null,data);
            });
        });
        // 2.  并发刷新
        totalTasks.push(function (data, callback) {
           if (!data.ids || data.ids.length <= 0){
               return callback("未获取到活动id",null);
           }
           var entity = new YjxActStatsModel();
           var tasks = [];
            // 记录执行任务数量
            for (var i=0; i<data.ids.length; i++) {
                var task = (function (actId) {
                    return function (ck) {
                        luaUtil.getActivityCount(actId,function(err,result){
                            if (err){
                                return ck(err, null);
                            }
                            entity.checkActivityStateInfo(actId,function (checkErr,count) {
                                if (count > 0){
                                    entity.updActivityViewStates(actId,result,function (updErr,res) {
                                        return ck(err,res);
                                    });
                                } else{
                                    entity.addActivityStateInfo(actId,result,function (updErr,res) {
                                        return ck(err,res);
                                    });
                                }
                            });
                        });
                    }
                })(data.ids[i]);
                if(task) {
                    tasks.push(task);
                }
            }
            async.parallelLimit(tasks, 5, function (error, results) {
                if(error) {
                    return callback(error,null);
                }
                return callback(null,data);
            });
        });
        //处理结果
        async.waterfall(totalTasks, function (error, data) {
            if (error) {
                return callback(error, null);
            }
            return callback(error, {});
        });
    };



    /**
     * 生成优惠码/推广码
     *
     * @author 毛凯
     * @date 2017-7-3
     *
     * @param cType 码类型：10直接抵扣,20满减券,30折扣券,40活动推广码
     * @param  userId 用户Id（cType=40时必须）
     * @param  desc      我的推广码
     * @param callback
     *          err: 切换失败
     *          data: 待定
     */
    api4backUtil.createPromoCode = function (cType,userId,desc,callback) {
        var code = api4backUtil.genPromoCode();
        var issue_time = new Date(); // 七月 23日 2018, 4:24:11 下午;
        var expiry_time = new moment().add(2,"y");
        expiry_time = new Date(expiry_time);
        var entity = new YjxCouponModel({
            c_type : cType,
            c_code : code,
            state : 20,
            issue_time : issue_time,
            expiry_time: expiry_time,
            desc : desc || "",
            user_id : userId
        });
        entity.saveToDB(function(saveErr, newId) {
            if (saveErr) {
                return callback('新建推荐码失败', null);
            }
            return callback(null,{cId:newId,cCode:code});
        });
    };



    /**
     * 修改推广码信息
     *
     * @author 毛凯
     * @date 2017-7-3
     *
     * @param cId 码类型：10直接抵扣,20满减券,30折扣券,40活动推广码
     * @param cCode 推荐码
     * @param  desc   我的推广码
     * @param callback
     *          err: 切换失败
     *          data: 待定
     */
    api4backUtil.updPromoCode = function (cId,cCode,desc,callback) {
        var entity = new YjxCouponModel({
            c_id : cId,
            c_code : cCode,
            desc : desc
        });
        entity.updateToDB(function(updErr){
            if(updErr){
                return callback(updErr);
            }
            return callback(null);
        });
    };



    /**
     * 获取推广码列表
     *
     * @author 毛凯
     * @date 2017-7-3
     *
     * @param pageNum 页码
     * @param pageSize 页容量
     * @param withTotalPage 是否需要总页数
     * @param cType  检索条件：码类型（10直接抵扣,20满减券,30折扣券,40活动推广码）
     * @param userId 检索条件：用户id（只返回绑定到该用户的码
     * @param  desc   检索条件：码备注（模糊匹配）
     * @param state  检索条件：码状态
     * @param callback
     *          err: 切换失败
     *          data: 待定
     */
    api4backUtil.getPromoCodeList = function (pageNum,pageSize,withTotalPage,cType,userId,desc,state,callback) {
         var entity = new YjxCouponModel();
         var type = cType.toString();
         var st = state.toString();
         entity.getCcodeList(pageNum,pageSize,type,userId,desc,st,function (err,result) {
             if (err) {
                 return callback(err, null);
             }

             if (!withTotalPage) {
                 return callback(null, {list:result});
             }
             entity.getCcodeListCnt(pageNum, pageSize, type, userId, desc, st, function (cntErr, count) {
                 if(cntErr){
                     return callback(cntErr, null);
                 }
                var totalPage =  Math.floor((count-1)/pageSize)+1;
                return callback(null,{list:result,totalPage:totalPage,currentPage:pageNum});
             });
         });
    };

    /**
     * 获取推广码奖励信息列表
     *
     * @author 毛凯
     * @date 2017-7-3
     *
     * @param pageNum 页码
     * @param pageSize 页容量
     * @param withTotalPage 是否需要总页数
     * @param actId 活动id
     * @param cId  检索条件：码id
     * @param userId 检索条件：用户id（只返回绑定到该用户的码
     * @param  desc   检索条件：码备注（模糊匹配）
     * @param callback
     *          err: 切换失败
     *          data: 待定
     */
    api4backUtil.getPromoCodeRewardList = function (pageNum,pageSize,withTotalPage,actId,cId,userId,desc,cCode,callback) {
       var entity = new YjxCouponModel();
       entity.getCcodeRewardList(pageNum,pageSize,actId,cId,userId,desc,cCode,function (err,result) {
           if (err) {
               return callback(err, null);
           }
           if (!withTotalPage) {
               return callback(err, {list: result || []});
           }
           entity.getCcodeRewardListCnt(pageNum,pageSize,actId,cId,userId,desc,cCode,function (cntErr,count){
               if(cntErr){
                   return callback(cntErr, null);
               }
               var totalPage =  Math.floor((count-1)/pageSize)+1;
               return callback(null,{list:result||[],totalPage:totalPage,currentPage:pageNum});
           });
       });
    };


    /***
     * 发送验证码
     * @author 毛凯
     * @date 2017-7-3
     * 方式: GET
     * 参数: mobile: 手机号
     * 参数: zone:   区号
     * 返回: {}
     */
    api4backUtil.getBackMobileVerCode = function(zone,mobile,callback){
        var redisKey = zone + '-' + mobile;
        // 检测redis
        vcdRedisCache.get(redisKey, function (error, result) {
            // 避免mobile被连续发送验证码
            var quickly = false;
            var recd = JSON.parse(result || '{}');
            if (recd && recd.vcode_mobile && recd.vcode_create_time) {
                var cur_time = Math.floor(Date.now() / 1000);//process.uptime();
                if (cur_time - Number(recd.vcode_create_time || '0') < 60) {
                    quickly = true;
                }
            }
            if (quickly) {
                return callback("您发送验证码太过频繁",null);
            }
            // 发送验证码
            var url = 'http://' + CONFIG.SMS_SERVER_DOMAIN + ':' + CONFIG.SMS_SERVER_PORT
                + '/itbweb/itbCom/sendYjxVerCode.action?mobile=' + mobile;
            //测试用地址
//            var url = 'http://192.168.31.52:8081/itbweb/itbCom/sendYjxVerCode.action?mobile='+ mobile;
            superagent.get(url)
                .end(function (err, res2) {
                    if (err) {
                        return callback("发送失败,请再试试!",null);
                    }
                    var retJson = JSON.parse(res2.text);
                    // 缓存验证码信息
                    if (retJson) {
                        if(retJson.success == 1) {
                            var newRecd = {
                                vcode_mobile: mobile || '',
                                vcode: retJson.data.code || '',
                                vcode_create_time: Math.floor(Date.now() / 1000),//process.uptime()
                            };
                            var redisValue = JSON.stringify(newRecd);
                            vcdRedisCache.set(redisKey, redisValue, {ttl: 60 * 5});// 设置失效时间5分钟
                            return callback(null, {});
                        }else if(retJson.success == 0 && (retJson.msg == "Aliyun ClientException: Frequency limit reaches." || retJson.msg == "isv.BUSINESS_LIMIT_CONTROL")){
                            return callback("获取验证码超过最大限制，明天再来吧", {});
                        }else{
                            return callback("发送失败,请再试试!", {});
                        }
                    } else {
                        return callback("发送失败,请再试试!", {});
                    }
                });
        });
    };


    /**
     * 验证验证码方法
     *
     * @author 毛凯
     * @date 2018-7-3
     *
     * @param mobile  18888888888  用户手机号, 验证规则同获取验证码
     * @param zone    +86 国际区号, 暂时固定传 +86
     * @param verCode 是 878789 六位验证码
     * @param callback 回调
     *                    err  错误信息  验证成功返回null
     */
    api4backUtil.validByVerCode = function (zone,mobile,verCode,callback) {
        var DEFAULT_TEST_MOBILE_FOR_CHECK="18696138681";
        var DEFAULT_TEST_MOBILE_FOR_CHECK2="18256276313";
        var DEFAULT_TEST_VCODE_FOR_CHECK="123456";
        var redisKey = zone + '-' + mobile;
        // 检查redis
        vcdRedisCache.get(redisKey, function (err, result) {
            //测试逻辑
            if (mobile == DEFAULT_TEST_MOBILE_FOR_CHECK || mobile == DEFAULT_TEST_MOBILE_FOR_CHECK2) {
                if (verCode != DEFAULT_TEST_VCODE_FOR_CHECK) {
                    return callback('验证码错误');
                }
                return callback(null);
            } else {
                //常规逻辑
                var recd = JSON.parse(result || '{}');
                // 比较时间，如果超过5分钟，则返回失败
                // 比较 vcode_create_time 和当前时间
                if (!recd.vcode) {
                    return callback('验证码错误');
                }
                var cur_time = Math.floor(Date.now() / 1000);
                if (cur_time - Number(recd.vcode_create_time || '0') >= 5 * 60) {
                    return callback('验证码已失效，请重新获取');
                }
                if (recd.vcode != verCode) {
                    return callback('验证码错误');
                }
                return callback(null);
            }
        });
    };

    /**
     * 手机号+验证码登录
     *
     * @author 毛凯
     * @date 2018-7-3
     *
     * @param mobile  18888888888  用户手机号, 验证规则同获取验证码
     * @param zone    +86 国际区号, 暂时固定传 +86
     * @param verCode 是 878789 六位验证码
     * @param callback 回调
     *           userId  如果该用户不存在则是新建用户的userId
     */
    api4backUtil.loginByBackMobileCode = function (zone, mobile, verCode,callback) {

        api4backUtil.validByVerCode(zone, mobile, verCode,function(err){
            if(err){
                return callback(err);
            }
            //查询有无用户

            var entity =  new YjxThirdPartyUserModel({
                field1 : mobile,
                del_flg : 0
            });
            entity.findFromDB(function(err,userInfo) {
                if (err) {
                    return callback(err, null);
                }
                if (userInfo && userInfo.length > 0) {
                    var userId = userInfo[0].user_id;
                    return callback(null, userId);
                }
                //没有查询到则注册
                var timeStamp = Date.parse(new Date()) / 1000;
                var startTimeTamp = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
                var dateNum =timeStamp-startTimeTamp;
                var newNum  = PrefixInteger(dateNum,5);

                // var photo = "http://itbour-back.oss-cn-hangzhou.aliyuncs.com/image/U13396/2017/12/15/181805976_wapZT7TnmRu3VV3Sm1MY";
                var photo = DEFAULT_USER_PROFILE_PHOTO;
                var nickname = "yjx_" + newNum;
                // var signature = "放纵你的自由";
                var signature = DEFAULT_USER_SIGNATURE;
                //先插入yjx_user
                entity =  new YjxUserModel({
                    user_type:20,     //用户类型: 0:未知, 10:内部人员, 20:普通用户
                    nickname: nickname,
                    profile_photo : photo,
                    signature : signature
                });
                entity.saveToDB(function(err,insertId){
                    if(err){
                        console.log("loginByMobileCode_v1_0 [saveToDB YjxUserModel] saveToDB" +err);
                        return callback(err);
                    }
                    entity = new YjxThirdPartyUserModel({
                        user_id : insertId,
                        account_type :10, //第三方账号类型: 0:未知, 10:手机号(需要密码), 11:邮箱(需要密码), 20:微信, 21:QQ, 30:小米, 100:一键生成
                        field1 : mobile,
                        field2 : "+86"
                    });
                    entity.saveToDB(function(err,insertThirdId){
                        if(err){
                            console.log("loginByMobileCode_v1_0 [saveToDB YjxThirdPartyUserModel] saveToDB" +err);
                            return callback(err,null);
                        }
                        return callback(null,insertId);
                    })

                });
            });
        });
    };

    /**
     * 自动补0方法
     *
     * @author 毛凯
     * @date 2018-7-3
     *
     * @param num  需要格式化的数字
     * @param length 需要多少位的数字长度
     * @return newNum 格式化好的数字
     * 如: num =1 ,length =5, 返回 newNum=00001
     */
    function PrefixInteger(num, length) {
        var newNum = ( "000000000000" + num ).substr( -length );
        return newNum;
    }

    /**
     * 获取用户详细信息
     *
     * @author 毛凯
     * @date 2018-7-3
     *

     * @param userId: （用户唯一标识）
     * @param callback 回调
     *              err 错误信息
     *              data 返回值
     * */

    api4backUtil.getUserDetailInfo_v1_0 = function(userId,callback){
        var tasks = [];

        // 0. 查询用户资料
        tasks.push(function (callback) {
            var entity =  new YjxUserModel({
                user_id: userId
            });
            //查询用户信息
            entity.findFromDB(function(err,userInfo){
                if(err){
                    return callback(err,null);
                }
                if (!userInfo || userInfo.length <= 0) {
                    return callback('无此用户信息', null);
                }
                //获取用户第三方信息
                entity.getThirdPartyUserInfo(userId,function(err,results) {
                    if (err) {
                        return callback(err, null);
                    }
                    // 一键秀用户资料信息
                    var usersInfo =  {
                        "userId" : userInfo[0].user_id,
                        "evaluation":userInfo[0].evaluation.toString()||"", // 用户评价分, 默认为0
                        "nickName" : userInfo[0].nickname||"",
                        "avatarUrl" : userInfo[0].profile_photo||"",
                        "sign" : userInfo[0].signature||""
                    };
                    var data =  api4backUtil.combinationuserInfo(results);
                    data.userInfo = usersInfo;
                    return callback(err, data);
                });
            });
        });
        // 1. 查询 vip 信息
        tasks.push(function(callback){
            api4backUtil.getUserVipInfo(userId, function(error, vipInfo){
                return callback(error, vipInfo);
            });
        });
        // 2. 查询积分信息
        tasks.push(function(callback){
            api4backUtil.getUserPointsInfo(userId, function(error, ptsInfo){
                return callback(error, ptsInfo);
            });
        });
        // 3. 查询收益信息
        tasks.push(function (callback) {
            api4backUtil.getUserActivityRewardInfo__v1_7(userId, function (error, rewards) {
                return callback(error, rewards);
            });
        });
        // 4. 查询用户组织信息
        tasks.push(function (callback) {
            (new YjxOrgRModel()).getUserOrganizationsInfo(userId, function (error, orgs) {
                return callback(error, orgs || []);
            });
        });
        // 5. 查询用户身份证号信息
        tasks.push(function (callback) {
            var entity = new YjxThirdPartyUserModel({
                user_id : userId,
                account_type: 12,
                del_flg : 0
            });
            entity.findFromDB(function (error, results) {
                if(error || !results || results.length <= 0) {
                    return callback(error, null);
                }


                // 身份证号脱敏处理
                var placeholder = '******************';
                var idCardNum = results[0].field1;
                placeholder = placeholder.substr(0, idCardNum.length -8);
                var prefix = idCardNum.substr(0, 4);
                var suffix = idCardNum.substr(idCardNum.length-4, 4);
                idCardNum = prefix + placeholder + suffix;
                // 身份证号脱敏处理

                var ret = {
                    idCardNum: idCardNum,
                    realName: results[0].field2,
                    // thumbs: results[0].field3,
                    gender: results[0].field4,
                    birthDay: results[0].field5,
                    address: results[0].field6
                };
                return callback(error, ret);
            })
        });

        // 串行执行
        async.parallel(tasks, function(error, results){
            if(error) return callback(error, null);
            var data = results[0];
            data.userInfo.vip = results[1];
            data.userInfo.wallet = results[2].wallet;
            data.userInfo.reward = results[3];
            data.userInfo.organizations = results[4];
            data.userInfo.idCardNum = results[5] ? results[5].idCardNum : null;
            return callback(error, data);
        })
    };


    /**
     * 组合用户信息
     *
     * @author 李强
     * @date 2017-11-17
     * @param results: （用户第三方账号信息）
     * 返回  return   {
            "userInfo" : {},
            "mobile" : {
                "zone" : "+86",
                "mobile" : 18888888888
                },
            "wechat" : {
                "token" : "ozZ04s8kqM6Gdm3AQy9pW1YK_RNo",
                "union" : "o07tHvwn0tck-ST-cDShA2UM_k4Q",
                "nickName" : "王俊",
                "avatarUrl":"http://itbour-user.oss-cn-hangzhou.aliyuncs.com/image/Unull/2017/10/31/154053345_wvk4TknmHKww7HztThwx.jpg?"},
            "QQ" : {},
            "sinaWeibo" : {}
        }
     * */
    api4backUtil.combinationuserInfo = function(results){
        //数据拼接
        var data = {
            "userInfo" : {},             //一键秀用户基本信息, userid必须存在
            "mobile" : {},               // 一键秀用户的手机号信息, 若未绑定, 则此字段为空
            "wechat" : {},             // 一键秀用户绑定的微信信息, 具体内容见微信登录可取得并保存的信息, 若未绑定微信, 此字段为空
            "QQ" : {},                    // 一键秀用户绑定的QQ信息, 具体内容见微信登录可取得并保存的信息, 若未绑定QQ, 此字段为空
            "sinaWeibo" : {}             // 一键秀用户绑定的sinaWeibo信息, 具体内容见微信登录可取得并保存的信息, 若未绑定sinaWeibo, 此字段为空
        };

        //用户第三方信息
        if(results && results.length>0) {
            for (var i = 0; i < results.length; i++) {
                var result = results[i];
                if (result.account_type == 10) {
                    //手机号
                    data.mobile = {
                        zone: result.field2 || "",
                        mobile: result.field1 || ""
                    }
                } else if (result.account_type == 20) {
                    //微信用户
                    data.wechat = {
                        "union": result.field1 || "",       // 微信 unionId
                        "token": result.field2 || "",       // 微信 openId
                        "nickName": result.nickname || "",
                        "avatarUrl": result.profile_photo || ""
                    }
                }
            }
        }
        return data;
    };

    /**
     * 获取当前用户vip信息
     * @author 毛凯
     * @date 2018-3-23
     * @param userId  用户的唯一标识
     * @return
     *          results  用户vip信息
     */
    api4backUtil.getUserVipInfo = function(userId,callback) {
        (new YjxMemberModel()).getVipInfo(userId, function(err,res){
            if(err){
                return callback(err || '暂无获取用户vip信息',null);
            }
            var vip ={};
            res = res ? res : {};
            vip.isVip = res.isVip || 0 ;   //1是vip 0不是vip
            vip.level = res.expireDayNum <= 0 ? 0 :res.level || 0;   //vip级别
            vip.expiryTime = res.expiryTime || ""; //vip到期时间
            vip.expiryTimeStamp = res.expiryTimeStamp ||0; //vip到期时间戳
            vip.expireDayNum = res.expireDayNum || 0;//vip离到期还剩天数
            return callback(null,vip);
        });
    };

    /**
     * 获取当前用户秀米(积分)信息
     * @author 毛凯
     * @date 2018-3-23
     * @param userId  用户的唯一标识
     * @return
     *          results  用户秀米信息
     */
    api4backUtil.getUserPointsInfo = function(userId,callback) {
        (new YjxUserPointsHisModel()).getPointsInfo(userId,function(err,res) {
            if (err) {
                return callback(err || '无秀米信息', null);
            }
            res = res ? res : {};
            var data = {
                wallet:{
                    pointBalance : res.pointBalance || 0,
                    pointBalanceUnit : '秀米'
                }
            };
            return callback(null,data);
        });
    };


    /**
     * 获取用户收益信息_ APP_1_7 添加
     *
     * @author 李强
     * @date 2018-06-08
     * @param userId   用户唯一标识
     **@param callback  回调
     *          err: 查询失败
     *          data : http://yapi.yijianxiu.com:7000/mock/11/yjx/v1/user/getUserActivityRewardInfo__v1_7
     *
     */
    api4backUtil.getUserActivityRewardInfo__v1_7 = function (userId, callback) {
        var totalTasks = [];
        // 1. 查询用户总收益
        totalTasks.push(function (callback) {
            var entity = new YjxActUserReward();
            var data = {};
            entity.getUserTotalReward(userId, function (error, results) {
                data.totalReward = results;
                return callback(error, data);
            });
        });

        // 2. 查询用户总余额
        totalTasks.push(function (data,callback) {
            var entity = new YjxActUserReward();
            entity.getUserBalance(userId, function (error, results) {
                data.balance = results;
                return callback(error, data);
            });
        });

        // 3. 查询用户已提现总额
        totalTasks.push(function (data,callback) {
            var entity = new YjxActFinanceHis();
            entity.getUserAlreadyCash(userId, function (error, results) {
                data.alreadyCash = results;
                return callback(error, data);
            });
        });

        // 4. 查询用户提现中总额
        totalTasks.push(function (data,callback) {
            var entity = new YjxActFinanceHis();
            entity.getUserProcessCash(userId, function (error, results) {
                data.processCash = results;
                return callback(error, data);
            });
        });
        async.waterfall(totalTasks, function (error, data) {
            var  ret = {
                "totalReward" : 0,                                         // 总计收益, 单位: 分
                "balance" : 0,                                             // 余额, 单位: 分,
                "alreadyCash" : 0,                                         // 已提现金额, 单位: 分
                "processCash" : 0,                                         // 处理提现中金额, 单位: 分
                "minDeposit" : CONFIG.YJX_ACTIVITY_CASH_LIMIT_MIN,             // 用户单笔提现的最小额度
                "maxDeposit" : CONFIG.YJX_ACTIVITY_CASH_LIMIT_MAX,             // 用户单笔提现的最大额度
                "times" : CONFIG.YJX_ACTIVITY_CASH_TIMES,                      // 用户每日提现次数上限
                "cashThreshold" : CONFIG.YJX_ACTIVITY_CASH_THRESHOLD           // 用户提现门槛值
            };

            if (error) {
                return callback(error, null);
            }

            //用户总收益
            if(data.totalReward && data.totalReward.length>0  && data.totalReward[0].totalReward){
                ret.totalReward = data.totalReward[0].totalReward;
            }

            //用户总余额
            if(data.balance && data.balance.length>0 && data.balance[0].balance){
                ret.balance = data.balance[0].balance;
            }

            //用户已提现总额
            if(data.alreadyCash && data.alreadyCash.length>0 && data.alreadyCash[0].alreadyCash){
                ret.alreadyCash = data.alreadyCash[0].alreadyCash;
            }

            //用户申请提现中总额
            if(data.processCash && data.processCash.length>0 && data.processCash[0].processCash){
                ret.processCash = data.processCash[0].processCash;
            }
            return callback(error, ret);
        });
    };

    /**
     * 获取网红公司用户资料
     * @param param
     * @param callback
     */
    api4backUtil.getRedWedUserInfo = function(param, callback) {
        var totalTask = [];//

        // 查询用户基本资料
        totalTask.push(function(callback){
            var data = {};
            var ent = new YjxUserModel;
            ent.getRedWedUserInfo(param, function(err, retInfo) {
                var sex = '未知';
                if (retInfo.length>0){
                    switch (retInfo[0].gender){
                        case 0: sex = '未知';break;
                        case 1: sex = '男';break;
                        case 2: sex = '女';break;
                        case 3: sex = '嘿嘿';break;
                    }
                }
                var userInfo = {
                    'user_id':retInfo[0].user_id,
                    'desc':retInfo[0].desc,
                    'mobile':retInfo[0].field1,
                    'gender':sex,
                    'birth':retInfo[0].birth,
                    'address':retInfo[0].address,
                    'addreIds':retInfo[0].addrIds,
                };
                data.userInfo = userInfo;
                return callback(err, data);
            });
        });

        // 1. 查询平台信息
        totalTask.push(function(callback){
            var ent = new YjxUserModel;
            ent.getRedWedUserPlat(param, function(err, platInfo) {

                return callback(err, platInfo);
            });
        });

        // 2. 查询用户标签信息
        totalTask.push(function(callback){
            var ent = new YjxUserModel;
            ent.getRedWedUserLabe(param, function(err, labelInfo) {
                return callback(err, labelInfo);
            });
        });

        // 3. 查询所有网红标签
        totalTask.push(function(callback){
            var ent = new YjxUserModel;
            ent.getRedWedAllLabe(param, function(err, labelInfo) {
                return callback(err, labelInfo);
            });
        });

        // 瀑布流方式执行
        async.parallel(totalTask,function(error,data){
            // console.log(data.userInfo);
            var ret = data[0];
            ret.userInfo.platList = data[1]
            ret.userInfo.label = data[2]
            ret.userInfo.labs = data[3]
            return callback(error,ret);
        })
    };


    /**
     * 给网红用户添加平台资料
     * author：李琦
     * @param param
     * @param callback
     */
    api4backUtil.addUserPlat = function(param, callback) {
        var ent = new YjxUserModel;
        ent.getRedWedUserPlat(param,function(error,ret){
            if (error){
                return callback(error, null);
            }

            if (ret && ret.length>0) {
                return callback("已添加过该平台", null);
            } else {
                ent.addUserPlat(param, function(err, retInfo) {
                    if (err){
                        return callback(err, null);
                    }
                    return callback(null, retInfo);
                });
            }
        });
    };

    /**
     * 编辑网红平台资料
     * author：李琦
     */
    api4backUtil.editPlat = function(param, callback) {
        var ent = new YjxUserModel;
        ent.editPlat(param, function(err, retInfo) {
            if (err){
                return callback(err, null);
            }
            return callback(null, retInfo);
        });
    };

    /**
     * 删除网红平台资料
     * author：李琦
     */
    api4backUtil.delUserPlat = function(param, callback) {
        var ent = new YjxUserModel;
        ent.editUserPlat(param,function(error,ret){
            if (error){
                return callback(error, null);
            }
            return callback(null,ret);
        });
    };

    /**
     * 获取单个平台资料
     * author：李琦
     */
    api4backUtil.getPlatInfo = function(param, callback) {
        var ent = new YjxUserModel;
        ent.getRedWedUserPlat(param,function(error,ret){
            if (error){
                return callback(error, null);
            }
            return callback(null,ret);
        });
    };


    /**
     * 编辑网红用户资料
     * author:liqi
     */
    api4backUtil.editWebRedUser = function(param, callback) {
        var totalTask = [];//

        // 1：更新网红的 备注信息
        totalTask.push(function(callback){
            var ent = new YjxUserModel;
            ent.editWebRedUserDesc(param, function(err, retInfo) {
                if (err) {
                    return callback(err,null);
                }
                return callback(err, retInfo);
            });
        });

        // 2：更新用户 性别 出生日期
        totalTask.push(function(callback){
            var ent = new YjxUserModel;
            ent.editWebRedUserBaseInfo(param, function(err, platInfo) {
                return callback(err, platInfo);
            });
        });

        // 3：更新用户地区 删除之前的 插入新的地区 type=2
        totalTask.push(function(callback){
            var ent = new YjxUserModel;
            ent.delWebRedUserOdlAddre(param, function(err, platInfo) {
                // 先删除用户地区资料
                if (err){
                    return callback(err, platInfo);
                }
                // 插入新的地址信息
                ent.editWebRedUserAddress(param,function(){
                    if (err){
                        return callback(err, platInfo);
                    }
                });
                return callback(err, platInfo);
            });
        });

        // 4 更新网红用户标签
        totalTask.push(function(callback){
            var ent = new YjxUserModel;
            ent.delWebRedUserOldLab(param, function(err, platInfo) {
                // 删除之前标签
                if (err){
                    return callback(err, platInfo);
                }
                var lab = param.labs;
                lab = lab.split(',');
                if (lab.length>0){
                    for(var i=0;i<lab.length;i++){
                        // 插入新的标签
                        ent.insertUserLab(lab[i],param,function(){
                            if (err){
                                return callback(err, platInfo);
                            }
                        });
                    }
                }

                return callback(err, platInfo);
            });
        });

        // 串行执行法则
        async.series(totalTask,function(error,data){
            return callback(error,data);
        })
    };

    return api4backUtil;
})();

module.exports = api4backUtil;